package simpledb.optimizer;

import simpledb.execution.Predicate;

/**
 * LogicalFilterNode 表示查询语句 WHERE 子句中的一个过滤条件。
 *
 * <p>过滤条件的形式为：t.f p c</p>
 * 其中：
 * - t 是一个表（可以是别名）
 * - f 是该表中的一个字段
 * - p 是比较操作符（如大于、等于等）
 * - c 是一个常量值
 */
public class LogicalFilterNode {

    /**
     * 过滤条件所涉及的表的别名（如果没有别名，则使用原始表名）
     */
    public final String       tableAlias;

    /**
     * 过滤条件中的谓词操作符（如 GREATER_THAN, EQUALS 等）
     * @see Predicate.Op
     */
    public final Predicate.Op p;

    /**
     * 过滤条件右侧的常量值（字符串形式）
     * 例如在 "field > 5" 中，c 的值为 "5"
     */
    public final String       c;

    /**
     * 字段的纯名称（不包含表名或别名）
     * 例如在 "t1.field1" 中，pureName 为 "field1"
     */
    public final String       fieldPureName;

    /**
     * 字段的限定名称（由表别名和字段名组成）
     * 格式为：tableAlias.fieldPureName
     */
    public final String       fieldQuantifiedName;

    /**
     * 构造一个新的 LogicalFilterNode 实例
     *
     * @param table 表的别名（或原名）
     * @param field 字段名称（可能带有表前缀，如 "t1.field1"）
     * @param pred 谓词操作符（如 GREATER_THAN、EQUALS 等）
     * @param constant 常量值（字符串形式）
     */
    public LogicalFilterNode(String table, String field, Predicate.Op pred, String constant) {
        tableAlias = table;
        p = pred;
        c = constant;

        // 分割字段名，提取纯字段名（去除表名/别名前缀）
        String[] tmps = field.split("[.]");
        if (tmps.length > 1)
            fieldPureName = tmps[tmps.length - 1];
        else
            fieldPureName = field;

        // 构造限定字段名：tableAlias.fieldPureName
        this.fieldQuantifiedName = tableAlias + "." + fieldPureName;
    }
}
